#ifndef _SUNSHINE_STRING_
#define _SUNSHINE_STRING_

/*
 * String 常用操作
 * *
 * lee sunshine
 * lss876@qq.com
 * Dec 11st, 2012
 */

#include <string>
#include <vector>

using std::string;
using std::vector;

namespace SUNSHINE
{
	class String
	{
		public:
			/*
			 * 使用指定的 分隔符 遍历拼接 vector<string> 中的元素
			 * *
			 * 返回拼接后的字符串
			 * *
			 * v[in] : 指定的vector<string>
			 * delimiter[in] : 指定的分隔符
			 */
			static string Concatenate(const vector<string> & v , const string & delimiter);

			/*
			 * 使用指定的 分隔符 拆分 string, 元素存入 vector<string> 中
			 * *
			 * 返回 保存了拆分后元素的vector<string>
			 * *
			 * s[in] : 指定的字符串
			 * delimiter[in] : 指定的分隔符
			 */
			static vector<string> Split(const string & s, const string & delimiter);

			/*
			 * 去除 源字符串 前导和尾部 指定的字符串
			 * *
			 * 返回 去除 源字符串 中 指定的 前导和尾部字符串 之后的 字符串
			 * *
			 * s[in] : 指定的源字符串
			 * toRemove[in, nullable] : 指定的要去除的字符串
			 */
			static string Trim(const string & s,
						const string & toRemove = " ")
			{
				string result(String::LTrim(s, toRemove));
				return String::RTrim(result, toRemove);
			}

			/*
			 * 去除 源字符串 前导 指定的字符串
			 * *
			 * 返回 去除 源字符串 中 指定的 前导字符串 之后的 字符串
			 * *
			 * s[in] : 指定的源字符串
			 * toRemove[in, nullable] : 指定的要去除的字符串
			 */
			static string LTrim(const string & s, const string & toRemove = " ")
			{
				string result;
				result.assign(s.begin() + s.find_first_not_of(toRemove),
							s.end());

				return result;
			}

			/*
			 * 去除 源字符串 尾部 指定的字符串
			 * *
			 * 返回 去除 源字符串 中 指定的 尾部字符串 之后的 字符串
			 * *
			 * s[in] : 指定的源字符串
			 * toRemove[in, nullable] : 指定的要去除的字符串
			 */
			static string RTrim(const string & s, const string & toRemove = " ")
			{
				string result;
				result.assign(s.begin(),
							s.begin() + s.find_last_not_of(toRemove) + 1);

				return result;
			}

			/*
			 * 获取指定字符串的大写形式
			 * *
			 * 返回指定字符串的大写形式
			 * *
			 * s[in] : 指定的字符串
			 */
			static string Uppercase(const string & s)
			{
				return String::Translation(s, L2U);
			}

			/*
			 * 获取指定字符串的小写形式
			 * *
			 * 返回指定字符串的小写形式
			 * *
			 * s[in] : 指定的字符串
			 */
			static string Lowercase(const string & s)
			{
				return String::Translation(s, U2L);
			}

		private:
			/* 
			 * 大小写转换枚举值
			 */
			enum CaseTranslation
			{
				/* uppercase -> lowercase */
				U2L = 0,

				/* lowercase -> uppercase */	
				L2U			
			};

			/*
			 * 按照指定的形式转换指定的字符串
			 * *
			 * 返回转换后字符串
			 * *
			 * s[in] : 指定的字符串
			 * ct[in]: 指定转换的形式
			 */
			static string Translation(const string & s, CaseTranslation ct)
			{
				if (s.empty())
				{
					return s;
				}

				const int DIFFERENCE = 32 * (ct == U2L ? 1 : -1);
				const char floor = (ct == U2L) ? 'A' : 'a';
				const char ceiling = (ct == U2L) ? 'Z' : 'z';

				string result(s);
				string::size_type index = 0;
				string::size_type resultLenght = result.size();

				while (index < resultLenght)
				{
					if (result[index] >= floor && result[index] <= ceiling)
					{
						result[index] += DIFFERENCE;
					}
					++index;
				}

				return result;
			}
	};
}

#endif
